f = open(r"H:\study\python\file\read.txt", "r", encoding="utf-8")
# 第三个参数 0不行，1和2看不出来变化，不知道具体什么含义。

# open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
# encoding 默认值是系统编码，比如Windows上gbk。

# 一次性读取出来，适合小文本文件，不适合大文件。
# content = f.read()
# print(content)

# 也可以有个数字参数，表示一次读取10个字符，因为文件是 utf-8 编码的；
# content = f.read(7)
# print(content) # "abcdefg"
# content = f.read(8)
# print(content) # "abcdefg你" 控制台中可见字符只有这些，但看到和下面的一行星号是紧挨着的，说明还没有读取到换行符 "\n";
# content = f.read(9)
# print(content) # "abcdefg" 控制台中可见字符只有这些，但看到和下面的一行星号之间空了一行，说明读取到了换行符 "\n";
# content = f.read(10)
# print(content) # "abcdefg\nh" 控制台中可见字符只有这些（除了\n，h显示在下一行中），但看到h和下面的一行星号之间紧挨着的，说明读取到了换行符 "\n"，并且不存在"\r"，因为如果有"\r"，这里不会显示 h。
# print("*************")

# 一次读取一行；
# content = f.readline()
# print(content)

# 也可以有个数字参数，表示10个字符；不过有点特别：
#
content = f.readline(255)
print(content)
# 7 时读取到了g，和下行星号紧挨着；
# 8 时读取到了 你，和下行星号紧挨着；
# 9 时读取到了换行符，，和下行星号隔了一行空行；此后，不管参数多大，比如255，还是这样。
# 由此可见，这个数字参数，针对一行内才有意义。跨行了就无意义了。
# print("*************")

# 一次读取全部内容，返回一个列表，每行是一个元素（元素结尾含有每行尾的换行符"\n" -- 我在Windows上的pycharm 中测试的也是只有这一个字符，"\r"不见了，不管是行尾还是行首。）；
# 可以有一个数字参数，应该大于0（测试发现，传参为0时，其实是读取所有内容，和不传参效果一致）；此时的返回值有点意思：
#       根据数字参数读取对应的行数，返回这些行组成的列表。
#       比如第一行10个字符（含换行符）
# content = f.readlines()
# print(content) 结果：['abcdefg你\n', 'hijklmn我\n', 'opqrst他']。

# content = f.readlines(1 -- 8)
# print(content) 测试发现，传参 1 -- 8（均含）效果一样，返回的列表中只有一个元素，就是第一行的内容，包含末尾的换行符"\n"。
# 但是，传递 9 时，就会返回两个元素，第二个元素是第二行内容，当然也含末尾的换行符"\n"。
# 所以，这里可以看到，传递的参数在计算时是不含换行符的。因为如果含换行符，传递 9 也应该只返回一个元素才对，但返回了2个。


# 设置游标位置
# f.seek(数字)

f.close()




# 上面是测试，所以简单写了；完整的应该如下：
try:
    f1 = open(r"H:\study\python\file\read.txt", "r", 2, "utf-8")
    content1 = f1.readline()
    print(content1)
finally:
    if f1:
        f1.close()

# 不过，Python 为我们提供了自动关闭资源的方式，所以在实际开发中不会使用上面的，而是如下：
with open(r"H:\study\python\file\demo.txt", "r", 2, "utf-8") as f2:
    print(f2.readline())
# 就这么简单，语句执行完毕，自动关闭资源。
